package com.mdd.common.util.aliyunContrastFaceVerify;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.cloudauth20190307.Client;
import com.aliyun.cloudauth20190307.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.mdd.common.entity.yangyangLeadingEnterprise.param.MetaInfoParam;
import com.mdd.common.util.ToolUtils;
import org.apache.commons.math3.util.Pair;

/**
 *
 * 前后端交互----发起认证请求
 *
 * https://help.aliyun.com/zh/id-verification/financial-grade-id-verification/id-verification-integration-process?spm=a2c4g.11186623.help-menu-2401581.d_3_0_0_0.70a034a8rGyFJM&scm=20140722.H_163102._.OR_help-T_cn~zh-V_1
 */
public class InitFaceVerify {
    // 使用单例模式优化性能
    private static com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();




    public static Pair<Boolean,Object> initFaceVerify(Long sceneId, String name, String certNo, MetaInfoParam param){
        InitFaceVerifyRequest request = new InitFaceVerifyRequest();
        // 请输入场景ID+L。
        request.setSceneId(sceneId);
        //商户请求的唯一标识，用于后续定位排查问题使用
        String randomString = ToolUtils.randomString(32);
        request.setOuterOrderNo(randomString);
        // 认证方案。 ID_PRO:活体认证；ID_PLUS：身份证和活体认证
        request.setProductCode("ID_PRO");
        // 模式。
        /**
         * LIVENESS（默认）：眨眼动作活体检测。
         * PHOTINUS_LIVENESS：眨眼动作活体+炫彩活体双重检测。
         * MULTI_ACTION：多动作活体检测。当前为眨眼+任意摇头检测。（顺序随机）
         * MOVE_ACTION（推荐）：远近动作+眨眼动作活体检测。
         * MOVE_PHOTINUS：远近动作+炫彩活体检测。
         */
//        request.setModel("LIVENESS");
        //身份证
        request.setCertType("IDENTITY_CARD");
        request.setCertName(name);
        request.setCertNo(certNo);
        // MetaInfo环境参数。
//        {
//            "zimVer": "3.0.0",
//                "appVersion": "1",
//                "bioMetaInfo": "4.1.0:1150****,0",
//                "appName": "com.aliyun.antcloudauth",
//                "deviceType": "ios",
//                "osVersion": "iOS 10.3.2",
//                "apdidToken": "",
//                "deviceModel": "iPhone9,1"
//        }
        Map<String, String> map = new HashMap<>();
        map.put("zimVer", param.getZimVer());
        map.put("appVersion", param.getAppVersion());
        map.put("bioMetaInfo", param.getBioMetaInfo());
        map.put("appName", param.getAppName());
        map.put("deviceType", param.getDeviceType());
        map.put("osVersion", param.getOsVersion());
        map.put("apdidToken", param.getApdidToken());
        map.put("deviceModel", param.getDeviceModel());
        String MetaInfo = JSONObject.toJSON(map).toString();
        System.out.println("前台传过来的参数为："+MetaInfo);
        request.setMetaInfo(MetaInfo);
//        request.setMetaInfo("{}");
        //request.setMobile("130xxxxxxxx");
        //request.setIp("114.xxx.xxx.xxx");
        ////自定义用户id
        //request.setUserId("12345xxxx");
        //request.setCallbackUrl("https://www.aliyundoc.com");
        //request.setCallbackToken("xxxxx");
        // 如需开启个人信息加密传输。
        //request.setEncryptType("SM2");
        //request.setCertName("BCRD/7ZkNy7Q*****M1BMBezZe8GaYHrLwyJv558w==");
        //request.setCertNo("BMjsstxK3S4b1YH*****Pet8ECObfxmLN92SLsNg==");

        // 推荐，支持服务路由。
        InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request);

        // 不支持服务自动路由。
        //InitFaceVerifyResponse response = initFaceVerify("cloudauth.cn-shanghai.aliyuncs.com", request);
        if(response!=null && response.getBody()!=null){
            InitFaceVerifyResponseBody body = response.getBody();
            if("200".equals(body.getCode())){
                System.out.println("请求成功");
                System.out.println(response.getBody().getMessage());
                System.out.println(body.getResultObject().getCertifyId());
                System.out.println(body.getResultObject().getCertifyUrl());
                System.out.println(body.getResultObject().getCertifyId());
                return new Pair<Boolean,Object>(Boolean.TRUE,  body.getResultObject().getCertifyId());
            }
        }
//        response.getBody().getRequestId();
//        response.getBody().getResultObject().getCertifyId();
//        System.out.println(response.getBody().getRequestId());
//        //200 请求成功
//        System.out.println(response.getBody().getCode());
//        System.out.println(response.getBody().getMessage());
//        System.out.println(response.getBody().getResultObject() == null ? null
//                : response.getBody().getResultObject().getCertifyId());
        return new Pair<Boolean,Object>(Boolean.FALSE,  response);
    }


    public static void main(String[] args) throws Exception {

        InitFaceVerifyRequest request = new InitFaceVerifyRequest();
        // 请输入场景ID+L。
        request.setSceneId(1000013298L);
        //商户请求的唯一标识，用于后续定位排查问题使用
        String randomString = ToolUtils.randomString(32);
        request.setOuterOrderNo(randomString);
        // 认证方案。 ID_PRO:活体认证；ID_PLUS：身份证和活体认证
        request.setProductCode("ID_PRO");

        // 模式。
        /**
         * LIVENESS（默认）：眨眼动作活体检测。
         * PHOTINUS_LIVENESS：眨眼动作活体+炫彩活体双重检测。
         * MULTI_ACTION：多动作活体检测。当前为眨眼+任意摇头检测。（顺序随机）
         * MOVE_ACTION（推荐）：远近动作+眨眼动作活体检测。
         * MOVE_PHOTINUS：远近动作+炫彩活体检测。
         */
//        request.setModel("LIVENESS");
        //身份证
        request.setCertType("IDENTITY_CARD");
        request.setCertName("岳建华");
        request.setCertNo("410521199709267033");
        // MetaInfo环境参数。
//        {
//            "zimVer": "3.0.0",
//                "appVersion": "1",
//                "bioMetaInfo": "4.1.0:1150****,0",
//                "appName": "com.aliyun.antcloudauth",
//                "deviceType": "ios",
//                "osVersion": "iOS 10.3.2",
//                "apdidToken": "",
//                "deviceModel": "iPhone9,1"
//        }
        Map<String, String> map = new HashMap<>();
        map.put("zimVer", "3.0.0");
        map.put("appVersion", "1");
        map.put("bioMetaInfo", "4.1.0:1150****,0");
        map.put("appName", "com.aliyun.antcloudauth");
        map.put("deviceType", "ios");
        map.put("osVersion", "iOS 10.3.2");
        map.put("apdidToken", "");
        map.put("deviceModel", "iPhone9,1");
        String p = JSONObject.toJSON(map).toString();
        System.out.println(JSONObject.toJSON(map).toString());
        request.setMetaInfo(p);
        //request.setMobile("130xxxxxxxx");
        //request.setIp("114.xxx.xxx.xxx");
        ////自定义用户id
        //request.setUserId("12345xxxx");
        //request.setCallbackUrl("https://www.aliyundoc.com");
        //request.setCallbackToken("xxxxx");
        // 如需开启个人信息加密传输。
        //request.setEncryptType("SM2");
        //request.setCertName("BCRD/7ZkNy7Q*****M1BMBezZe8GaYHrLwyJv558w==");
        //request.setCertNo("BMjsstxK3S4b1YH*****Pet8ECObfxmLN92SLsNg==");

        // 推荐，支持服务路由。
        InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request);

        // 不支持服务自动路由。
        //InitFaceVerifyResponse response = initFaceVerify("cloudauth.cn-shanghai.aliyuncs.com", request);

        response.getBody().getRequestId();
        response.getBody().getResultObject().getCertifyId();
        System.out.println(response.getBody().getRequestId());
        //200 请求成功
        System.out.println(response.getBody().getCode());
        System.out.println(response.getBody().getMessage());
        System.out.println(response.getBody().getResultObject() == null ? null
                : response.getBody().getResultObject().getCertifyId());
    }

    private static InitFaceVerifyResponse initFaceVerifyAutoRoute(InitFaceVerifyRequest request) {
        // 第一个为主区域Endpoint，第二个为备区域Endpoint。
        List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com");
        InitFaceVerifyResponse lastResponse = null;
        for (int i=0; i<endpoints.size(); i++) {
            try {
                InitFaceVerifyResponse response = initFaceVerify(endpoints.get(i), request);
                lastResponse = response;

                // 服务端错误，切换到下个区域调用。
                if(response != null){
//                    if(500 == response.getStatusCode()){
//                        continue;
//                    }
                    if(response.getBody() != null){
                        if("500".equals(response.getBody().getCode())){
                            continue;
                        }
                    }
                }

                // 正常返回
                return lastResponse;
            }catch (Exception e) {
                e.printStackTrace();
                if(i == endpoints.size()-1){
                    throw new RuntimeException(e);
                }
            }
        }

        return lastResponse;
    }


    private static InitFaceVerifyResponse initFaceVerify(String endpoint, InitFaceVerifyRequest request)
            throws Exception {
        // 阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
        // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
        // 本示例通过阿里云Credentials工具从环境变量中读取AccessKey，来实现API访问的身份验证。如何配置环境变量，请参见https://help.aliyun.com/document_detail/378657.html。
        Config config = new Config();
        config.setCredential(credentialClient);
        config.setEndpoint(endpoint);
        config.setAccessKeyId("LTAI5t6J3udSCwjEh8kPrSTd")
                .setAccessKeySecret("5gbOEgbhHzNyrcW0meMACetgn9kY4X");
        // 设置http代理。
        //config.setHttpProxy("http://xx.xx.xx.xx:xxxx");
        // 设置https代理。
        //config.setHttpsProxy("https://xx.xx.xx.xx:xxxx");
        Client client = new Client(config);

        // 创建RuntimeObject实例并设置运行参数。
        RuntimeOptions runtime = new RuntimeOptions();
        runtime.readTimeout = 10000;
        runtime.connectTimeout = 10000;

        return client.initFaceVerifyWithOptions(request, runtime);
    }

}
